#pragma once
#include<iostream>
#include<unistd.h>
#include<ctime>
#include<cstdlib>
#include<cassert>
#include<vector>

//task_t 是函数指针类型：
typedef void(*task_t)();

//所维护的任务表：
std::vector<task_t> tasks;

//用户任务添加区：上层代码不需要看见!
void Print()
{
    std::cout << "I am a print task." << std::endl;
}
void DownLoad()
{
    std::cout << "I am a download task" << std::endl;
    int cnt = 10;
    while(cnt--)
    {
        usleep(100);
        std::cout << "...";
    }
    std::cout << std::endl;
}
void Flush()
{
    std::cout << "I am a flush task." << std::endl;
}

//调用接口：上层代码需要看见并使用！
//1. 执行任务：
void ExcuteTask(int taskid)
{
    assert(taskid >= 0 && taskid <= (tasks.size() - 1));
    tasks[taskid]();
}
//2.选择一个任务：
int SelectTask()
{
    return rand() % tasks.size();
}
//3.加载任务：
void LoadTask()
{
    srand(time(nullptr));
    tasks.push_back(Print);
    tasks.push_back(DownLoad);
    tasks.push_back(Flush);
}